package controller;

import bo.AcaoGrupoBO;
import bo.UsuarioGrupoBO;
import java.io.Serializable;
import java.util.ArrayList;
import java.util.List;
import javax.faces.bean.ManagedBean;
import javax.faces.bean.ViewScoped;
import model.AcaoGrupo;
import model.UsuarioGrupo;
import model.UsuarioGrupoAcao;
import util.ConsUtil;
import util.CustomException;
import util.FacesUtil;

/**
 *
 * @author rodolpho
 */
@ManagedBean(name = "usuarioGrupoController")
@ViewScoped
public class UsuarioGrupoController implements Serializable {

    private UsuarioGrupoBO usuarioGrupoBO = new UsuarioGrupoBO();
    private AcaoGrupoBO acaoGrupoBO = new AcaoGrupoBO();
    private ConsUtil.Operacao operacao;
    private List<UsuarioGrupo> usuarioGrupos;
    private List<UsuarioGrupo> usuarioGruposFiltrados;
    private UsuarioGrupo usuarioGrupoSelecionado = new UsuarioGrupo();
    private List<UsuarioGrupoAcao> usuarioGrupoAcoes;
    private List<UsuarioGrupoAcao> usuarioGrupoAcoesPorGrupo;
    private List<UsuarioGrupoAcao> usuarioGrupoAcoesPorGrupoFiltrados;
    private List<AcaoGrupo> acaoGrupos;
    private AcaoGrupo acaoGrupoSelecionado;

    public UsuarioGrupoController() {
        try {
            this.usuarioGrupos = usuarioGrupoBO.selecionarTodos();
            this.operacao = ConsUtil.Operacao.CONSULTAR;
        } catch (CustomException e) {
            FacesUtil.exibirMsgExcecao(e);
        }
    }

    public void carregarAcoesPorGrupo() {
        setUsuarioGrupoAcoesPorGrupo(new ArrayList());
        for (UsuarioGrupoAcao usuarioGrupoAcao : getUsuarioGrupoAcoes()) {
            if (usuarioGrupoAcao.getAcao().getAcaoGrupo().getAgrCodigo() == getAcaoGrupoSelecionado().getAgrCodigo()) {
                getUsuarioGrupoAcoesPorGrupo().add(usuarioGrupoAcao);
            }
        }
    }

    public void novo() {
        try {
            setUsuarioGrupoSelecionado(new UsuarioGrupo());
            getUsuarioGrupoSelecionado().setUgrBloqueado(Boolean.FALSE);
            setAcaoGrupos(acaoGrupoBO.selecionarTodos());
            if (!getAcaoGrupos().isEmpty()) {
                setAcaoGrupoSelecionado(getAcaoGrupos().get(0));
            }
            setUsuarioGrupoAcoes(usuarioGrupoBO.selecionarAcoesPorNovoUsuarioGrupo(getUsuarioGrupoSelecionado()));
            carregarAcoesPorGrupo();
            setOperacao(ConsUtil.Operacao.NOVO);
        } catch (CustomException e) {
            FacesUtil.exibirMsgExcecao(e);
        }
    }

    public void alterar() {
        try {
            Long ugrCodigo = Long.valueOf(FacesUtil.getRequestParameterMap("ugrCodigo"));
            setUsuarioGrupoSelecionado(usuarioGrupoBO.selecionarPorId(ugrCodigo));
            setAcaoGrupos(acaoGrupoBO.selecionarTodos());
            if (!getAcaoGrupos().isEmpty()) {
                setAcaoGrupoSelecionado(getAcaoGrupos().get(0));
            }
            setUsuarioGrupoAcoes(usuarioGrupoBO.selecionarAcoesPorUsuarioGrupo(getUsuarioGrupoSelecionado()));
            carregarAcoesPorGrupo();
            setOperacao(ConsUtil.Operacao.ALTERAR);
        } catch (CustomException e) {
            FacesUtil.exibirMsgExcecao(e);
        }
    }

    public void excluir() {
        try {
            Long ugrCodigo = Long.valueOf(FacesUtil.getRequestParameterMap("ugrCodigo"));
            setUsuarioGrupoSelecionado(usuarioGrupoBO.selecionarPorId(ugrCodigo));
            setAcaoGrupos(acaoGrupoBO.selecionarTodos());
            if (!getAcaoGrupos().isEmpty()) {
                setAcaoGrupoSelecionado(getAcaoGrupos().get(0));
            }
            setUsuarioGrupoAcoes(usuarioGrupoBO.selecionarAcoesPorUsuarioGrupo(getUsuarioGrupoSelecionado()));
            carregarAcoesPorGrupo();
            setOperacao(ConsUtil.Operacao.EXCLUIR);
        } catch (CustomException e) {
            FacesUtil.exibirMsgExcecao(e);
        }
    }

    public void salvar() {
        try {
            usuarioGrupoBO.salvar(usuarioGrupoSelecionado, usuarioGrupoAcoes);
            setUsuarioGrupos(usuarioGrupoBO.selecionarTodos());
            setOperacao(ConsUtil.Operacao.CONSULTAR);
            FacesUtil.exibirMsgInfo(null, "Concluído", "Grupo de usuários salvo com sucesso!");
        } catch (CustomException e) {
            FacesUtil.exibirMsgExcecao(e);
        }
    }

    public void confirmarExclusao() {
        try {
            if (usuarioGrupoBO.possuiUsuarios(usuarioGrupoSelecionado.getUgrCodigo())) {
                FacesUtil.exibirMsgWarn(null, "Atenção!", "Este grupo possui usuários e não pode ser excluído.");
            } else {
                usuarioGrupoBO.excluir(usuarioGrupoSelecionado);
                setUsuarioGrupos(usuarioGrupoBO.selecionarTodos());
                setOperacao(ConsUtil.Operacao.CONSULTAR);
                FacesUtil.exibirMsgInfo(null, "Concluído", "Grupo de usuários excluído com sucesso!");
            }
        } catch (CustomException e) {
            FacesUtil.exibirMsgExcecao(e);
        }
    }

    public ConsUtil.Operacao getOperacao() {
        return operacao;
    }

    public void setOperacao(ConsUtil.Operacao operacao) {
        this.operacao = operacao;
    }

    public List<UsuarioGrupo> getUsuarioGrupos() {
        return usuarioGrupos;
    }

    public void setUsuarioGrupos(List<UsuarioGrupo> usuarioGrupos) {
        this.usuarioGrupos = usuarioGrupos;
    }

    public UsuarioGrupo getUsuarioGrupoSelecionado() {
        return usuarioGrupoSelecionado;
    }

    public void setUsuarioGrupoSelecionado(UsuarioGrupo usuarioGrupoSelecionado) {
        this.usuarioGrupoSelecionado = usuarioGrupoSelecionado;
    }

    public List<UsuarioGrupo> getUsuarioGruposFiltrados() {
        return usuarioGruposFiltrados;
    }

    public void setUsuarioGruposFiltrados(List<UsuarioGrupo> usuarioGruposFiltrados) {
        this.usuarioGruposFiltrados = usuarioGruposFiltrados;
    }

    public AcaoGrupoBO getAcaoGrupoBO() {
        return acaoGrupoBO;
    }

    public void setAcaoGrupoBO(AcaoGrupoBO acaoGrupoBO) {
        this.acaoGrupoBO = acaoGrupoBO;
    }

    public List<UsuarioGrupoAcao> getUsuarioGrupoAcoes() {
        return usuarioGrupoAcoes;
    }

    public void setUsuarioGrupoAcoes(List<UsuarioGrupoAcao> usuarioGrupoAcoes) {
        this.usuarioGrupoAcoes = usuarioGrupoAcoes;
    }

    public List<UsuarioGrupoAcao> getUsuarioGrupoAcoesPorGrupo() {
        return usuarioGrupoAcoesPorGrupo;
    }

    public void setUsuarioGrupoAcoesPorGrupo(List<UsuarioGrupoAcao> usuarioGrupoAcoesPorGrupo) {
        this.usuarioGrupoAcoesPorGrupo = usuarioGrupoAcoesPorGrupo;
    }

    public List<UsuarioGrupoAcao> getUsuarioGrupoAcoesPorGrupoFiltrados() {
        return usuarioGrupoAcoesPorGrupoFiltrados;
    }

    public void setUsuarioGrupoAcoesPorGrupoFiltrados(List<UsuarioGrupoAcao> usuarioGrupoAcoesPorGrupoFiltrados) {
        this.usuarioGrupoAcoesPorGrupoFiltrados = usuarioGrupoAcoesPorGrupoFiltrados;
    }

    public List<AcaoGrupo> getAcaoGrupos() {
        return acaoGrupos;
    }

    public void setAcaoGrupos(List<AcaoGrupo> acaoGrupos) {
        this.acaoGrupos = acaoGrupos;
    }

    public AcaoGrupo getAcaoGrupoSelecionado() {
        return acaoGrupoSelecionado;
    }

    public void setAcaoGrupoSelecionado(AcaoGrupo acaoGrupoSelecionado) {
        this.acaoGrupoSelecionado = acaoGrupoSelecionado;
    }
}
